package com.myproject.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.myproject.enums.ErrorCode;
import com.myproject.vo.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 基础控制器类，提供通用的CRUD操作方法
 * @param <S> 服务类型
 * @param <T> 实体类型
 */
public class BaseController<S extends IService<T>, T> {
    @Autowired
    protected S service;

    /**
     * 保存实体
     * @param entity 要保存的实体对象
     * @return Result<T> 操作结果
     */
    @PostMapping
    public Result<T> save(@RequestBody T entity) {
        boolean success = service.save(entity);
        return success ? Result.success() : Result.error(ErrorCode.SAVE_FAILED);
    }

    /**
     * 更新实体
     * @param entity 要更新的实体对象
     * @return Result<T> 操作结果
     */
    @PutMapping
    public Result<T> update(@RequestBody T entity) {
        boolean success = service.updateById(entity);
        return success ? Result.success() : Result.error(ErrorCode.UPDATE_FAILED);
    }

    /**
     * 根据ID删除实体
     * @param id 要删除的实体ID
     * @return Result<T> 操作结果
     */
    @DeleteMapping("/{id}")
    public Result<T> delete(@PathVariable Long id) {
        boolean success = service.removeById(id);
        return success ? Result.success() : Result.error(ErrorCode.DELETE_FAILED);
    }

    /**
     * 根据ID获取实体
     * @param id 实体ID
     * @return Result<T> 包含查询结果的响应对象，如果未找到则返回错误
     */
    @GetMapping("/{id}")
    public Result<T> getById(@PathVariable Long id) {
        T entity = service.getById(id);
        return entity != null ? Result.success(entity) : Result.error(ErrorCode.NOT_FOUND);
    }

    /**
     * 分页查询实体
     * @param current 当前页码，默认为1
     * @param size 每页数量，默认为10
     * @param query 查询条件实体
     * @return Result<IPage<T>> 包含分页查询结果的响应对象
     */
    @GetMapping("/page")
    public Result<IPage<T>> page(@RequestParam(defaultValue = "1") int current,
                                @RequestParam(defaultValue = "10") int size,
                                T query) {
        Page<T> page = new Page<>(current, size);
        QueryWrapper<T> wrapper = new QueryWrapper<>(query);
        IPage<T> result = service.page(page, wrapper);
        return Result.success(result);
    }
}